#include <stdio.h>
#include <unistd.h>
#include <signal.h>

// volatile关键字，告诉编译器，这个变量只能从内存读
volatile int g_flag = 0;
// int g_flag = 0;  // 没有volatile关键字，就 无法保持内存可见性

void changeflag(int signo)
{
    (void)signo;
    printf("将g_flag, 从%d->%d\n", g_flag, 1);
    g_flag = 1;
}
int main()
{
    signal(2, changeflag);

    // 写法1：编译器会直接给优化掉了，即编译器认为while循环里，
    // 没有做任何的事情，故默认g_flag不会被修改，
    // 就把它直接存到寄存器里去了，从今往后，在执行while循环的判断语句时，
    // 直接只从寄存器里拿数据，而全局变量存在内存中，
    // 信号触发后改变了g_flag，只是改的内存中的，而寄存器中的一直不会被改变
    while (!g_flag); // 解决办法就是给全局变量添加 volatile关键字，告诉编译器，这个变量只能从内存读
    

    // 写法2，由于while循环里有东西，所以不会被优化
    // while (!g_flag)
    // {
    //     printf("g_flag : %d\n", g_flag);
    //     sleep(1);
    // }

    printf("process quit normal!\n");
    return 0;
}